/* eslint-disable no-prototype-builtins */
import axios from "axios";
import "./interceptor";

axios.defaults.headers.post["Content-Type"] =
  "application/x-www-form-urlencoded";

const ajax = {
  /**
   * @description 请求处理主体
   * @param { Object } headers 请求头配置
   * @param { String } type 请求类型：GET,POST,PUT等
   * @param { String } path 请求地址，例如/login
   * @param { Object | * } data 请求参数
   * @param { Boolean } loading 是否有加载中状态
   * @param { Object } opts 请求中参数配置：目前用到的为{responseType: 'blob'(响应数据类型：用于文件下载时参数配置)}
   * @param { Function } callback 回调函数，返回接口响应数据（未经处理）
   * @param { Object } extend 拓展配置：目前用到的为{isShowMessage: Boolean(是否显示接口错误信息：目前用于登录功能中错误信息不弹框显示)}
   */
  request: function ({
    headers,
    type = "GET",
    path,
    data = {},
    opts,
    callback = null,
    extend,
  }) {
    axios.defaults.baseURL = "";
    axios.defaults.timeout = 25000;
    type = type.toUpperCase(); // 请求方法统一转换为大写格式
    /** ***********请求参数处理 start*************/
    let options = {
      method: type,
      url: path,
      headers: headers && typeof headers === "object" ? headers : {},
    };
    let time = new Date().getTime() + 50000;
    options["time"] = time;
    options[type === "GET" ? "params" : "data"] = data;

    if (opts && typeof opts === "object") {
      for (let f in opts) {
        if (opts.hasOwnProperty(f)) {
          options[f] = opts[f];
        }
      }
    }
    /** ***********请求参数处理 end*************/
    return new Promise((resolve, reject) => {
      const postRequest = async () => {
        try {
          const res = await axios(options);
          // 请求返回处理
          typeof callback === "function" && callback(res.data || res);
          if (res && res.status === 200 && res.data.code === 200) {
            // 接口请求正常，且是正常数据返回
            resolve(res.data || false);
          } else if (res && res.status === 200) {
            // 说明是文件流
            // const blob = new Blob([res.data], { type: fileTypeObj[opts.fileType] });
            const blob = new Blob([res.data]);
            const fileReader = new FileReader();
            fileReader.readAsDataURL(blob);
            fileReader.onload = (e) => {
              const a = document.createElement("a");
              a.style.display = "none";
              a.href = e.target.result;
              a.target = "_blank";
              a.download = `${opts.fileName}.${opts.fileType}`;
              document.body.appendChild(a);
              a.click();
              document.body.removeChild(a);
            };
            resolve(res.data);
          } else {
            // 接口请求异常
            !(
              extend &&
              extend.hasOwnProperty("isShowMessage") &&
              !extend.isShowMessage
            ) && ajax.handleError.call(this, res.data);
            reject(res.data);
          }
        } catch (err) {
          !(
            extend &&
            extend.hasOwnProperty("isShowMessage") &&
            !extend.isShowMessage
          ) && ajax.handleError.call(this, err);
          reject(err);
        }
      };
      postRequest();
    });
  },
  /**
   * @description 请求异常处理，包含http请求的异常处理
   * @param { Object } err 错误信息，其中：
   * HttpRequestMessage: 请求说明
   * StatusCode: 请求状态码，其中403为token验证失败，需进行登录过期提示
   */
  handleError: function (
    err = { HttpRequestMessage: "网络异常，请稍后再试！" }
  ) {
    // 请求被主动取消时不再做后续信息提示处理
    if (axios.isCancel(err)) {
      return;
    }

    if (err.hasOwnProperty("StatusCode")) {
      // 接口响应状态码
      switch (err.StatusCode) {
        // 403 token验证失败
        case 403:
          if (
            !(
              document.getElementsByClassName("token-expiration") &&
              document.getElementsByClassName("token-expiration").length > 0
            )
          ) {
            this.$confirm("您的登录信息已过期，请重新登录！", "登录过期提示", {
              customClass: "token-expiration",
              confirmButtonText: "确定",
              cancelButtonText: "取消",
            })
              .then(() => {
                this.$router.push("/login");
                localStorage.clear(); // 清除存储信息
              })
              .catch(() => {});
          }
          break;
        case 401:
        case 402:
        case 500:
        default:
          this.$message.error(err.HttpRequestMessage);
      }
    } else {
      if (err.HttpRequestMessage.indexOf("未授权") !== -1) {
        this.$router.push("/login");
        localStorage.clear(); // 清除存储信息
      }
      if (err.HttpRequestMessage) {
        this.$message.error(err.HttpRequestMessage || "网络异常，请稍后再试！");
      } else {
        this.$message.error(err);
      }
    }
  },
};
export default ajax;
